package cn.tedu.hongbeifang.service.impl;

import cn.tedu.hongbeifang.ex.ServiceException;
import cn.tedu.hongbeifang.mapper.BannerMapper;
import cn.tedu.hongbeifang.pojo.dto.BannerAddNewDTO;
import cn.tedu.hongbeifang.pojo.dto.BannerUpdateDTO;
import cn.tedu.hongbeifang.pojo.entity.Banner;
import cn.tedu.hongbeifang.pojo.vo.BannerListItemVO;
import cn.tedu.hongbeifang.pojo.vo.BannerStandardVO;
import cn.tedu.hongbeifang.service.IBannerService;
import cn.tedu.hongbeifang.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
@Slf4j
@Service
public class BannerServiceImpl implements IBannerService {
    @Autowired
    private BannerMapper bannerMapper;
    @Value("${dirPath}")
    private String dirPath;
    public String upload(MultipartFile picFile) throws IOException {
        String fileName = picFile.getOriginalFilename();
        log.debug("接收到的文件名:{}",fileName);
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID()+suffix;
        //准备日期相关的路径部分   /2023/02/15/
        SimpleDateFormat format = new SimpleDateFormat("/yyyy/MM/dd/");
        String datePath = format.format(new Date());
        File dirFile = new File(dirPath+datePath);
        if(!dirFile.exists()){
            dirFile.mkdirs();
        }
        String filePath = dirPath+datePath+fileName;
        //保存文件 异常抛出
        picFile.transferTo(new File(filePath));
        //把日期路径和文件名拼接后响应给客户端    /2023/02/14/xxx.jpg
        return datePath+fileName;
    }
    public void remove(String url){
        new File(dirPath+url).delete();
    }

    @Override
    public void addNew(BannerAddNewDTO bannerAddNewDTO) {
        log.debug("开始处理【添加轮播图】的业务，参数：{}", bannerAddNewDTO);
        String url = bannerAddNewDTO.getUrl();
        int count = bannerMapper.countByUrl(url);
        log.debug("根据url【{}】统计数量，结果：{}", url, count);
        // 判断统计结果是否大于0
        if (count > 0) {
            // 是：url被占用，抛出异常
            String message = "添加轮播图失败，轮播图url已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        // 创建Album对象
        Banner banner = new Banner();
        // 调用BeanUtils.copyProperties(源,目标)将参数对象中的属性复制到Album对象中
        BeanUtils.copyProperties(bannerAddNewDTO, banner);
        // 调用Mapper对象的insert()执行插入相册数据
        log.debug("即将执行插入数据，参数：{}", banner);
        int rows = bannerMapper.insert(banner);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【根据ID删除轮播图】的业务，参数：{}", id);
        // 调用Mapper对象的getStandardById()执行查询
        BannerStandardVO banner = bannerMapper.getStandardById(id);
        log.debug("根据ID={}检查轮播图数据是否存在，查询结果：{}", id, banner);
        // 判断查询结果是否为null
        if (banner == null) {
            // 是：数据不存在，抛出异常
            String message = "删除轮播图失败，尝试删除的轮播图数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", id);
        int rows = bannerMapper.deleteById(id);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
        this.remove(banner.getUrl());

    }

    @Override
    public void updateInfoById(Long id, BannerUpdateDTO bannerUpdateDTO) {
        log.debug("开始处理【修改轮播图详情】的业务，ID：{}，新数据：{}", id, bannerUpdateDTO);
        // 调用Mapper对象的getStandardById()执行查询
        BannerStandardVO queryResult = bannerMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：抛出异常
            String message = "修改轮播图详情失败，尝试修改的轮播图数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }


        int count = bannerMapper.countByUrlAndNotId(id, bannerUpdateDTO.getUrl());
        // 判断统计结果是否大于0
        if (count > 0) {
            // 是：url被占用，抛出异常
            String message = "修改轮播图详情失败，轮播图url已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        // 创建Banner对象
        Banner banner = new Banner();
        // 复制属性，设置ID
        BeanUtils.copyProperties(bannerUpdateDTO, banner);
        banner.setId(id);
        // 调用Mapper对象的update()方法执行修改
        int rows = bannerMapper.update(banner);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
        if(!bannerUpdateDTO.getUrl().equals(queryResult.getUrl())){
            this.remove(banner.getUrl());
        }
    }

    @Override
    public BannerStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据ID查询轮播图详情】的业务，参数：{}", id);
        BannerStandardVO queryResult = bannerMapper.getStandardById(id);
        if (queryResult == null) {
            // 是：抛出异常
            String message = "查询轮播图详情失败，轮播图数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return queryResult;
    }

    @Override
    public List<BannerListItemVO> list() {
        log.debug("开始处理【查询轮播图列表】的业务，无参数");
         List<BannerListItemVO> list = bannerMapper.list();
        return list;
    }
}
